#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>

//1.创建全局日志器
std::shared_ptr<spdlog::logger> gDefaultLogger;
//2.进行全局日志器的创建与初始化
void initLogger(const bool mode,const std::string& file,int level)
{
    //mode=true,release模式，mode=false,debug模式
    if(mode == false)
    {
        //调试模式，创建标准输出日志器，输出等级为最低
        gDefaultLogger = spdlog::stdout_color_mt("degault-logger");
        gDefaultLogger->set_level(spdlog::level::trace);    
        gDefaultLogger->flush_on(spdlog::level::trace); 
    }
    else
    {
        //发布模式，创建文件输出日志器，输出等级根据参数而定
        gDefaultLogger = spdlog::basic_logger_mt("degault-logger",file);
        gDefaultLogger->set_level((spdlog::level::level_enum)level);    
        gDefaultLogger->flush_on((spdlog::level::level_enum)level); 
    }
    //设置输出格式
     gDefaultLogger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
}

//3.添加行号显示
#define LOG_TRACE(format, ...) gDefaultLogger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) gDefaultLogger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) gDefaultLogger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) gDefaultLogger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) gDefaultLogger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) gDefaultLogger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
